const 字串解码器 = new TextDecoder()
const 字串编码器 = new TextEncoder()
export const 解码字串 = 字串解码器.decode.bind(字串解码器)
export const 编码字串 = 字串编码器.encode.bind(字串编码器)

function 字串UTF8缓冲器长度(字串) { return 是字串(字串) && 编码字串(字串).length || 字串 }
export function 试取字串(缓冲区, 起, 长) {
  起 = 字串UTF8缓冲器长度(起), 缓冲区 = 缓冲区.buffer
  return 字串解码器.decode(new DataView(缓冲区, 起, 长))
}
export function 试取消息头为字串(消息, 预期类型) {
  if (!Buffer.isBuffer(消息)) throw ('消息应是缓冲区类型')
  预期类型 = 组化(预期类型)
  return 预期类型.find(类型表示 => 试取字串(消息, 0, 字串UTF8缓冲器长度(类型表示)))
}

export function 等几秒(停下几秒 = 3) { return new Promise(继续 => setTimeout(继续, 停下几秒 * 1000)) }

export function 组化(_) { return Array.isArray(_) ? _ : [_] }
export function 反组化(_) { return Array.isArray(_[0]) ? _[0] : _ }
export function 字串化(对象, 缩进空格数) { return 是字串(对象) ? 对象 : JSON.stringify(对象, null, 缩进空格数) }
export function 字串化2(对象) { return 字串化(对象, 2) }
export function 是正则(_) { return _ instanceof RegExp }
export function 是元素(_) { return _ instanceof Element }
export function 是字串(_) { return typeof _ === 'string' }